import { isString } from "./istype";

/**
 * 匹配是否为中文字符
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isChinese(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5]+$/;
    return reg.test(str);
}

/**
 * 匹配是否为英文字母
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isEnglish(str: string): boolean {
    const reg = /^[a-zA-Z]+$/;
    return reg.test(str);
}

/**
 * 匹配是否为URL地址
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isUrl(str: string): boolean {
    const reg = /^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+/;
    return reg.test(str);
}

/**
 * 匹配是否为手机号码字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isPhone(str: string): boolean {
    const reg = /^1[3456789]\d{9}$/;
    return reg.test(str);
}

/**
 * 匹配是否为邮箱地址
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isEmail(str: string): boolean {
    const reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
    return reg.test(str);
}

/**
 * 匹配是否为身份证号码字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isIdCard(str: string): boolean {
    const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
    return reg.test(str);
}

/**
 * 是否是数字构成的字符串
 * - 如果 val 是不是字符串则直接返回 false
 * - 如果 val 是字符串则返回该字符串是否表示数组
 * @param {string} val - 待检测的变量
 * @returns {boolean} - 是否匹配成功
 */
export function isNumberStr(val: unknown): boolean {
    if(isString(val)){
        const reg = /^-?[0-9]+$/;
        return reg.test(val);
    }
    return false
}

/**
 * 匹配小数字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isDecimalStr(str: string): boolean {
    const reg = /^\d+\.\d+$/;
    return reg.test(str);
}

/**
 * 匹配整数字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isIntegerStr(str: string): boolean {
    const reg = /^-?\d+$/;
    return reg.test(str);
}


/**
 * 匹配时间字符串 格式：hh:mm:ss
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isTime(str: string): boolean {
    const reg = /^([01]\d|2[0-3]):([0-5]\d):([0-5]\d)$/;
    return reg.test(str);
}

/**
 * 匹配邮政编码字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isPostalCode(str: string): boolean {
    const reg = /^[1-9]\d{5}$/;
    return reg.test(str);
}

/**
 * 匹配HTML标签字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isHtmlTag(str: string): boolean {
    const reg = /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/;
    return reg.test(str);
}

/**
 * 匹配QQ号码字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isQQ(str: string): boolean {
    const reg = /^[1-9][0-9]{4,10}$/;
    return reg.test(str);
}

/**
 * 匹配微信号字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isWechat(str: string): boolean {
    const reg = /^[a-zA-Z][-_a-zA-Z0-9]{5,19}$/;
    return reg.test(str);
}

/**
 * 匹配车牌号码字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isLicensePlate(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}$/;
    return reg.test(str);
}


/**
 * 匹配16进制颜色值字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isHexColor(str: string): boolean {
    const reg = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;
    return reg.test(str);
}

/**
 * 匹配中文姓名字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isChineseName(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5]{2,4}$/;
    return reg.test(str);
}


/**
 * 匹配银行卡号字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isBankCard(str: string): boolean {
    const reg = /^([1-9])(\d{14}|\d{18})$/;
    return reg.test(str);
}

/**
 * 匹配数字和字母组合字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isNumberAndLetter(str: string): boolean {
    const reg = /^[0-9a-zA-Z]+$/;
    return reg.test(str);
}

/**
 * 匹配中文、英文、数字和下划线组成的字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isChineseEnglishNumberUnderline(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5_a-zA-Z0-9]+$/;
    return reg.test(str);
}

/**
 * 匹配中文、英文、数字和空格组成的字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isChineseEnglishNumberSpace(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5_a-zA-Z0-9\s]+$/;
    return reg.test(str);
}

/**
 * 匹配中文、英文、数字和中划线组成的字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isChineseEnglishNumberDash(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5_a-zA-Z0-9-]+$/;
    return reg.test(str);
}

/**
 * 匹配中文、英文、数字和斜杠组成的字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isChineseEnglishNumberSlash(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5_a-zA-Z0-9/]+$/;
    return reg.test(str);
}

/**
 * 匹配中文、英文、数字和冒号组成的字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isChineseEnglishNumberColon(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5_a-zA-Z0-9:]+$/;
    return reg.test(str);
}

/**
 * 匹配中文、英文、数字和问号组成的字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isChineseEnglishNumberQuestion(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5_a-zA-Z0-9?]+$/;
    return reg.test(str);
}

/**
 * 匹配中文、英文、数字和感叹号组成的字符串
 * @param {string} str - 待匹配的字符串
 * @returns {boolean} - 是否匹配成功
 */
export function isChineseEnglishNumberExclamation(str: string): boolean {
    const reg = /^[\u4e00-\u9fa5_a-zA-Z0-9!]+$/;
    return reg.test(str);
}

